Skip to content

feat: social share preview images and fix duplicate URL#142

Merged
Hugo0 merged 2 commits intomainfrom
feat/social-share-preview
Mar 14, 2026
Merged

feat: social share preview images and fix duplicate URL#142
Hugo0 merged 2 commits intomainfrom
feat/social-share-preview

Conversation

@Hugo0
Copy link
Owner

@Hugo0 Hugo0 commented Mar 14, 2026

Summary

  • Fix duplicate URL in share text: getShareText() included the URL, and navigator.share({text, url}) passed it again separately — platforms appended both. Now builds fullText once with ?r= param.
  • Dynamic social preview: Shared URLs include ?r=5 (or ?r=x), which serves a language-specific OG image showing the score and challenge text in the native language.
  • 455 pre-generated share images: 65 languages × 7 results (1-6, x), 13MB total.
  • Share translations in language configs: Challenge text lives in each language_config.json under share_challenge_win/share_challenge_lose, following the established pattern.

Test plan

  • Share from game → clipboard has URL exactly once, with ?r= param
  • Visit /en?r=5 → view source shows share/en_5.png in og:image
  • Visit /en?r=abc → falls back to default og:image
  • Visit /en (no param) → default og:image unchanged
  • After deploy: paste shared URL into Facebook/Twitter debugger → preview shows score image

- Fix duplicate URL bug: getShareText() no longer includes URL (was being
  appended twice). shareResults() now builds fullText with ?r= param and
  passes it as single text to navigator.share() to avoid platform-dependent
  URL duplication.
- Add OG meta tag overrides: when ?r= query param is present, serve
  language-specific share preview images and challenge text as og:title
  and og:description.
- Make og:image overridable in _base_head.html via template variable.
- Parse ?r= param in Flask language() route and pass to template.
- Add generate_share_images.py script and share_translations.json with
  challenge text in 65 languages.
- Add 455 pre-generated 1200x630 PNG share images (all languages x results).
@coderabbitai
Copy link

coderabbitai bot commented Mar 14, 2026

Warning

Rate limit exceeded

@Hugo0 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 6 minutes and 14 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: dd8f0e21-bed2-411f-b794-f547c2c78e4c

📥 Commits

Reviewing files that changed from the base of the PR and between 65312e2 and d12c1a1.

📒 Files selected for processing (67)
  • scripts/curate_words.py
  • scripts/generate_share_images.py
  • scripts/hunspellToJSON.py
  • scripts/utils/google_trans_new.py
  • webapp/data/default_language_config.json
  • webapp/data/languages/ar/language_config.json
  • webapp/data/languages/az/language_config.json
  • webapp/data/languages/bg/language_config.json
  • webapp/data/languages/br/language_config.json
  • webapp/data/languages/ca/language_config.json
  • webapp/data/languages/ckb/language_config.json
  • webapp/data/languages/cs/language_config.json
  • webapp/data/languages/da/language_config.json
  • webapp/data/languages/de/language_config.json
  • webapp/data/languages/el/language_config.json
  • webapp/data/languages/eo/language_config.json
  • webapp/data/languages/es/language_config.json
  • webapp/data/languages/et/language_config.json
  • webapp/data/languages/eu/language_config.json
  • webapp/data/languages/fa/language_config.json
  • webapp/data/languages/fi/language_config.json
  • webapp/data/languages/fo/language_config.json
  • webapp/data/languages/fr/language_config.json
  • webapp/data/languages/fur/language_config.json
  • webapp/data/languages/fy/language_config.json
  • webapp/data/languages/ga/language_config.json
  • webapp/data/languages/gd/language_config.json
  • webapp/data/languages/gl/language_config.json
  • webapp/data/languages/he/language_config.json
  • webapp/data/languages/hr/language_config.json
  • webapp/data/languages/hu/language_config.json
  • webapp/data/languages/ia/language_config.json
  • webapp/data/languages/ie/language_config.json
  • webapp/data/languages/is/language_config.json
  • webapp/data/languages/it/language_config.json
  • webapp/data/languages/ka/language_config.json
  • webapp/data/languages/ko/language_config.json
  • webapp/data/languages/la/language_config.json
  • webapp/data/languages/lb/language_config.json
  • webapp/data/languages/lt/language_config.json
  • webapp/data/languages/ltg/language_config.json
  • webapp/data/languages/lv/language_config.json
  • webapp/data/languages/mi/language_config.json
  • webapp/data/languages/mk/language_config.json
  • webapp/data/languages/mn/language_config.json
  • webapp/data/languages/nb/language_config.json
  • webapp/data/languages/nds/language_config.json
  • webapp/data/languages/ne/language_config.json
  • webapp/data/languages/nl/language_config.json
  • webapp/data/languages/nn/language_config.json
  • webapp/data/languages/oc/language_config.json
  • webapp/data/languages/pau/language_config.json
  • webapp/data/languages/pl/language_config.json
  • webapp/data/languages/pt/language_config.json
  • webapp/data/languages/qya/language_config.json
  • webapp/data/languages/ro/language_config.json
  • webapp/data/languages/ru/language_config.json
  • webapp/data/languages/rw/language_config.json
  • webapp/data/languages/sk/language_config.json
  • webapp/data/languages/sl/language_config.json
  • webapp/data/languages/sr/language_config.json
  • webapp/data/languages/sv/language_config.json
  • webapp/data/languages/tk/language_config.json
  • webapp/data/languages/tlh/language_config.json
  • webapp/data/languages/tr/language_config.json
  • webapp/data/languages/uk/language_config.json
  • webapp/data/languages/vi/language_config.json
📝 Walkthrough

Walkthrough

PR adds social sharing features by modifying the frontend share flow to include a result query parameter in shared URLs, introducing a new Python script to pre-generate PNG share images across multiple languages with RTL text support, updating the backend to parse and validate the result parameter, and providing localized share message translations.

Changes

Cohort / File(s) Summary
Frontend Share Flow
frontend/src/game.ts
Refactored shareResults to build a single fullText string combining share text and URL with result query parameter (r). Simplified logic to use consistent payload across Web Share API, clipboard copy, and fallback modal.
Share Image Generation
scripts/generate_share_images.py
New script generating 1200x630 PNG share images for multiple languages and results (1-6, x). Includes Wordle-style tile rendering, RTL/bidi text handling with Unicode reshaping, score display with color coding, and image composition with configurable fonts and language support.
Backend Share Context
webapp/app.py
Added validation and parsing of r query parameter in language route (allowed values: "1"-"6" or "x"). Passes validated share_result to template context for game.html rendering.
Share Translations Data
webapp/data/share_translations.json
New JSON file containing localized Wordle share message templates for multiple languages, with "win" and "lose" strings using {n} placeholder for attempt count.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 Bounces with delight
A burrow of sharing, tiles shining bright,
RTL whispers in each language's sound,
Images woven across every ground,
This happy dev's code takes flight! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 71.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately describes the main changes: fixing duplicate URL in share text and adding social preview images.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/social-share-preview
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
scripts/generate_share_images.py (3)

77-77: Add strict=True to zip() for safety.

The static analyzer flagged this: if TILE_LETTERS and TILE_PATTERN ever have different lengths, the mismatch would be silently ignored. Adding strict=True will raise a ValueError if lengths differ.

🔧 Proposed fix
-    for i, (letter, pattern) in enumerate(zip(TILE_LETTERS, TILE_PATTERN)):
+    for i, (letter, pattern) in enumerate(zip(TILE_LETTERS, TILE_PATTERN, strict=True)):
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_share_images.py` at line 77, Update the loop that enumerates
pairs from TILE_LETTERS and TILE_PATTERN to use zip(..., strict=True) so
mismatched lengths raise a ValueError; specifically modify the
enumerate(zip(TILE_LETTERS, TILE_PATTERN)) usage in the generate_share_images.py
loop to enumerate(zip(TILE_LETTERS, TILE_PATTERN, strict=True)) to ensure the
lengths of TILE_LETTERS and TILE_PATTERN are enforced at runtime.

220-265: Consider adding error handling for missing translations or configs.

If a language directory exists but lacks language_config.json, or if a translation is missing entirely, the script continues with fallbacks. This is acceptable, but logging warnings would help catch missing translations during generation.

📝 Optional: Add logging for missing translations
+import logging
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
 def main():
     # Load translations
     with open(TRANSLATIONS_PATH) as f:
         translations = json.load(f)
 
     # ... existing code ...
 
     for lang_code in target_langs:
         name_native = lang_names.get(lang_code, lang_code)
         trans = translations.get(lang_code, translations.get("en", {}))
+        if lang_code not in translations:
+            logger.warning(f"No translation for {lang_code}, using English fallback")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_share_images.py` around lines 220 - 265, In main(), add
warning logs when expected language assets are missing: when iterating LANG_DIR
if language_config.json is absent log a warning mentioning the lang_code and
that name_native fell back to lang_code (reference lang_names and
language_config.json), and after loading TRANSLATIONS_PATH check for missing
language entries and when trans falls back to "en" or uses default strings for
"win"/"lose" emit a warning that translations for lang_code are incomplete
(reference translations, trans, and the use of "win"/"lose"). Use the existing
logging facility (or import logging) to emit these warnings so they appear
during generation without changing fallback behavior.

142-149: Simplify redundant score color logic.

The conditions can be simplified — result == "1" is already covered by int(result) <= 3, and the last two branches both set YELLOW.

♻️ Suggested simplification
     if result == "x":
         score_text = "X/6"
         score_color = GRAY
     else:
         score_text = f"{result}/6"
-        if result == "1":
-            score_color = GREEN
-        elif int(result) <= 3:
-            score_color = GREEN
-        elif int(result) <= 5:
-            score_color = YELLOW
-        else:
-            score_color = YELLOW
+        score_color = GREEN if int(result) <= 3 else YELLOW
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/generate_share_images.py` around lines 142 - 149, The current
branching for assigning score_color is redundant; convert result to an integer
once (use the variable result) and replace the multiple branches (including the
unnecessary result == "1" check) with a simple check: if int_result <= 3 set
score_color = GREEN, otherwise set score_color = YELLOW; update the logic around
the score_color assignment (variables: result, score_color, constants GREEN and
YELLOW) to remove the duplicate branches and avoid repeated int() conversions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@scripts/generate_share_images.py`:
- Line 77: Update the loop that enumerates pairs from TILE_LETTERS and
TILE_PATTERN to use zip(..., strict=True) so mismatched lengths raise a
ValueError; specifically modify the enumerate(zip(TILE_LETTERS, TILE_PATTERN))
usage in the generate_share_images.py loop to enumerate(zip(TILE_LETTERS,
TILE_PATTERN, strict=True)) to ensure the lengths of TILE_LETTERS and
TILE_PATTERN are enforced at runtime.
- Around line 220-265: In main(), add warning logs when expected language assets
are missing: when iterating LANG_DIR if language_config.json is absent log a
warning mentioning the lang_code and that name_native fell back to lang_code
(reference lang_names and language_config.json), and after loading
TRANSLATIONS_PATH check for missing language entries and when trans falls back
to "en" or uses default strings for "win"/"lose" emit a warning that
translations for lang_code are incomplete (reference translations, trans, and
the use of "win"/"lose"). Use the existing logging facility (or import logging)
to emit these warnings so they appear during generation without changing
fallback behavior.
- Around line 142-149: The current branching for assigning score_color is
redundant; convert result to an integer once (use the variable result) and
replace the multiple branches (including the unnecessary result == "1" check)
with a simple check: if int_result <= 3 set score_color = GREEN, otherwise set
score_color = YELLOW; update the logic around the score_color assignment
(variables: result, score_color, constants GREEN and YELLOW) to remove the
duplicate branches and avoid repeated int() conversions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7905e0d3-8a4a-4c7f-ac0d-d1d7287c96cb

📥 Commits

Reviewing files that changed from the base of the PR and between b689e59 and 65312e2.

⛔ Files ignored due to path filters (296)
  • webapp/static/images/share/ar_1.png is excluded by !**/*.png
  • webapp/static/images/share/ar_2.png is excluded by !**/*.png
  • webapp/static/images/share/ar_3.png is excluded by !**/*.png
  • webapp/static/images/share/ar_4.png is excluded by !**/*.png
  • webapp/static/images/share/ar_5.png is excluded by !**/*.png
  • webapp/static/images/share/ar_6.png is excluded by !**/*.png
  • webapp/static/images/share/ar_x.png is excluded by !**/*.png
  • webapp/static/images/share/az_1.png is excluded by !**/*.png
  • webapp/static/images/share/az_2.png is excluded by !**/*.png
  • webapp/static/images/share/az_3.png is excluded by !**/*.png
  • webapp/static/images/share/az_4.png is excluded by !**/*.png
  • webapp/static/images/share/az_5.png is excluded by !**/*.png
  • webapp/static/images/share/az_6.png is excluded by !**/*.png
  • webapp/static/images/share/az_x.png is excluded by !**/*.png
  • webapp/static/images/share/bg_1.png is excluded by !**/*.png
  • webapp/static/images/share/bg_2.png is excluded by !**/*.png
  • webapp/static/images/share/bg_3.png is excluded by !**/*.png
  • webapp/static/images/share/bg_4.png is excluded by !**/*.png
  • webapp/static/images/share/bg_5.png is excluded by !**/*.png
  • webapp/static/images/share/bg_6.png is excluded by !**/*.png
  • webapp/static/images/share/bg_x.png is excluded by !**/*.png
  • webapp/static/images/share/br_1.png is excluded by !**/*.png
  • webapp/static/images/share/br_2.png is excluded by !**/*.png
  • webapp/static/images/share/br_3.png is excluded by !**/*.png
  • webapp/static/images/share/br_4.png is excluded by !**/*.png
  • webapp/static/images/share/br_5.png is excluded by !**/*.png
  • webapp/static/images/share/br_6.png is excluded by !**/*.png
  • webapp/static/images/share/br_x.png is excluded by !**/*.png
  • webapp/static/images/share/ca_1.png is excluded by !**/*.png
  • webapp/static/images/share/ca_2.png is excluded by !**/*.png
  • webapp/static/images/share/ca_3.png is excluded by !**/*.png
  • webapp/static/images/share/ca_4.png is excluded by !**/*.png
  • webapp/static/images/share/ca_5.png is excluded by !**/*.png
  • webapp/static/images/share/ca_6.png is excluded by !**/*.png
  • webapp/static/images/share/ca_x.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_1.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_2.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_3.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_4.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_5.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_6.png is excluded by !**/*.png
  • webapp/static/images/share/ckb_x.png is excluded by !**/*.png
  • webapp/static/images/share/cs_1.png is excluded by !**/*.png
  • webapp/static/images/share/cs_2.png is excluded by !**/*.png
  • webapp/static/images/share/cs_3.png is excluded by !**/*.png
  • webapp/static/images/share/cs_4.png is excluded by !**/*.png
  • webapp/static/images/share/cs_5.png is excluded by !**/*.png
  • webapp/static/images/share/cs_6.png is excluded by !**/*.png
  • webapp/static/images/share/cs_x.png is excluded by !**/*.png
  • webapp/static/images/share/da_1.png is excluded by !**/*.png
  • webapp/static/images/share/da_2.png is excluded by !**/*.png
  • webapp/static/images/share/da_3.png is excluded by !**/*.png
  • webapp/static/images/share/da_4.png is excluded by !**/*.png
  • webapp/static/images/share/da_5.png is excluded by !**/*.png
  • webapp/static/images/share/da_6.png is excluded by !**/*.png
  • webapp/static/images/share/da_x.png is excluded by !**/*.png
  • webapp/static/images/share/de_1.png is excluded by !**/*.png
  • webapp/static/images/share/de_2.png is excluded by !**/*.png
  • webapp/static/images/share/de_3.png is excluded by !**/*.png
  • webapp/static/images/share/de_4.png is excluded by !**/*.png
  • webapp/static/images/share/de_5.png is excluded by !**/*.png
  • webapp/static/images/share/de_6.png is excluded by !**/*.png
  • webapp/static/images/share/de_x.png is excluded by !**/*.png
  • webapp/static/images/share/el_1.png is excluded by !**/*.png
  • webapp/static/images/share/el_2.png is excluded by !**/*.png
  • webapp/static/images/share/el_3.png is excluded by !**/*.png
  • webapp/static/images/share/el_4.png is excluded by !**/*.png
  • webapp/static/images/share/el_5.png is excluded by !**/*.png
  • webapp/static/images/share/el_6.png is excluded by !**/*.png
  • webapp/static/images/share/el_x.png is excluded by !**/*.png
  • webapp/static/images/share/en_1.png is excluded by !**/*.png
  • webapp/static/images/share/en_2.png is excluded by !**/*.png
  • webapp/static/images/share/en_3.png is excluded by !**/*.png
  • webapp/static/images/share/en_4.png is excluded by !**/*.png
  • webapp/static/images/share/en_5.png is excluded by !**/*.png
  • webapp/static/images/share/en_6.png is excluded by !**/*.png
  • webapp/static/images/share/en_x.png is excluded by !**/*.png
  • webapp/static/images/share/eo_1.png is excluded by !**/*.png
  • webapp/static/images/share/eo_2.png is excluded by !**/*.png
  • webapp/static/images/share/eo_3.png is excluded by !**/*.png
  • webapp/static/images/share/eo_4.png is excluded by !**/*.png
  • webapp/static/images/share/eo_5.png is excluded by !**/*.png
  • webapp/static/images/share/eo_6.png is excluded by !**/*.png
  • webapp/static/images/share/eo_x.png is excluded by !**/*.png
  • webapp/static/images/share/es_1.png is excluded by !**/*.png
  • webapp/static/images/share/es_2.png is excluded by !**/*.png
  • webapp/static/images/share/es_3.png is excluded by !**/*.png
  • webapp/static/images/share/es_4.png is excluded by !**/*.png
  • webapp/static/images/share/es_5.png is excluded by !**/*.png
  • webapp/static/images/share/es_6.png is excluded by !**/*.png
  • webapp/static/images/share/es_x.png is excluded by !**/*.png
  • webapp/static/images/share/et_1.png is excluded by !**/*.png
  • webapp/static/images/share/et_2.png is excluded by !**/*.png
  • webapp/static/images/share/et_3.png is excluded by !**/*.png
  • webapp/static/images/share/et_4.png is excluded by !**/*.png
  • webapp/static/images/share/et_5.png is excluded by !**/*.png
  • webapp/static/images/share/et_6.png is excluded by !**/*.png
  • webapp/static/images/share/et_x.png is excluded by !**/*.png
  • webapp/static/images/share/eu_1.png is excluded by !**/*.png
  • webapp/static/images/share/eu_2.png is excluded by !**/*.png
  • webapp/static/images/share/eu_3.png is excluded by !**/*.png
  • webapp/static/images/share/eu_4.png is excluded by !**/*.png
  • webapp/static/images/share/eu_5.png is excluded by !**/*.png
  • webapp/static/images/share/eu_6.png is excluded by !**/*.png
  • webapp/static/images/share/eu_x.png is excluded by !**/*.png
  • webapp/static/images/share/fa_1.png is excluded by !**/*.png
  • webapp/static/images/share/fa_2.png is excluded by !**/*.png
  • webapp/static/images/share/fa_3.png is excluded by !**/*.png
  • webapp/static/images/share/fa_4.png is excluded by !**/*.png
  • webapp/static/images/share/fa_5.png is excluded by !**/*.png
  • webapp/static/images/share/fa_6.png is excluded by !**/*.png
  • webapp/static/images/share/fa_x.png is excluded by !**/*.png
  • webapp/static/images/share/fi_1.png is excluded by !**/*.png
  • webapp/static/images/share/fi_2.png is excluded by !**/*.png
  • webapp/static/images/share/fi_3.png is excluded by !**/*.png
  • webapp/static/images/share/fi_4.png is excluded by !**/*.png
  • webapp/static/images/share/fi_5.png is excluded by !**/*.png
  • webapp/static/images/share/fi_6.png is excluded by !**/*.png
  • webapp/static/images/share/fi_x.png is excluded by !**/*.png
  • webapp/static/images/share/fo_1.png is excluded by !**/*.png
  • webapp/static/images/share/fo_2.png is excluded by !**/*.png
  • webapp/static/images/share/fo_3.png is excluded by !**/*.png
  • webapp/static/images/share/fo_4.png is excluded by !**/*.png
  • webapp/static/images/share/fo_5.png is excluded by !**/*.png
  • webapp/static/images/share/fo_6.png is excluded by !**/*.png
  • webapp/static/images/share/fo_x.png is excluded by !**/*.png
  • webapp/static/images/share/fr_1.png is excluded by !**/*.png
  • webapp/static/images/share/fr_2.png is excluded by !**/*.png
  • webapp/static/images/share/fr_3.png is excluded by !**/*.png
  • webapp/static/images/share/fr_4.png is excluded by !**/*.png
  • webapp/static/images/share/fr_5.png is excluded by !**/*.png
  • webapp/static/images/share/fr_6.png is excluded by !**/*.png
  • webapp/static/images/share/fr_x.png is excluded by !**/*.png
  • webapp/static/images/share/fur_1.png is excluded by !**/*.png
  • webapp/static/images/share/fur_2.png is excluded by !**/*.png
  • webapp/static/images/share/fur_3.png is excluded by !**/*.png
  • webapp/static/images/share/fur_4.png is excluded by !**/*.png
  • webapp/static/images/share/fur_5.png is excluded by !**/*.png
  • webapp/static/images/share/fur_6.png is excluded by !**/*.png
  • webapp/static/images/share/fur_x.png is excluded by !**/*.png
  • webapp/static/images/share/fy_1.png is excluded by !**/*.png
  • webapp/static/images/share/fy_2.png is excluded by !**/*.png
  • webapp/static/images/share/fy_3.png is excluded by !**/*.png
  • webapp/static/images/share/fy_4.png is excluded by !**/*.png
  • webapp/static/images/share/fy_5.png is excluded by !**/*.png
  • webapp/static/images/share/fy_6.png is excluded by !**/*.png
  • webapp/static/images/share/fy_x.png is excluded by !**/*.png
  • webapp/static/images/share/ga_1.png is excluded by !**/*.png
  • webapp/static/images/share/ga_2.png is excluded by !**/*.png
  • webapp/static/images/share/ga_3.png is excluded by !**/*.png
  • webapp/static/images/share/ga_4.png is excluded by !**/*.png
  • webapp/static/images/share/ga_5.png is excluded by !**/*.png
  • webapp/static/images/share/ga_6.png is excluded by !**/*.png
  • webapp/static/images/share/ga_x.png is excluded by !**/*.png
  • webapp/static/images/share/gd_1.png is excluded by !**/*.png
  • webapp/static/images/share/gd_2.png is excluded by !**/*.png
  • webapp/static/images/share/gd_3.png is excluded by !**/*.png
  • webapp/static/images/share/gd_4.png is excluded by !**/*.png
  • webapp/static/images/share/gd_5.png is excluded by !**/*.png
  • webapp/static/images/share/gd_6.png is excluded by !**/*.png
  • webapp/static/images/share/gd_x.png is excluded by !**/*.png
  • webapp/static/images/share/gl_1.png is excluded by !**/*.png
  • webapp/static/images/share/gl_2.png is excluded by !**/*.png
  • webapp/static/images/share/gl_3.png is excluded by !**/*.png
  • webapp/static/images/share/gl_4.png is excluded by !**/*.png
  • webapp/static/images/share/gl_5.png is excluded by !**/*.png
  • webapp/static/images/share/gl_6.png is excluded by !**/*.png
  • webapp/static/images/share/gl_x.png is excluded by !**/*.png
  • webapp/static/images/share/he_1.png is excluded by !**/*.png
  • webapp/static/images/share/he_2.png is excluded by !**/*.png
  • webapp/static/images/share/he_3.png is excluded by !**/*.png
  • webapp/static/images/share/he_4.png is excluded by !**/*.png
  • webapp/static/images/share/he_5.png is excluded by !**/*.png
  • webapp/static/images/share/he_6.png is excluded by !**/*.png
  • webapp/static/images/share/he_x.png is excluded by !**/*.png
  • webapp/static/images/share/hr_1.png is excluded by !**/*.png
  • webapp/static/images/share/hr_2.png is excluded by !**/*.png
  • webapp/static/images/share/hr_3.png is excluded by !**/*.png
  • webapp/static/images/share/hr_4.png is excluded by !**/*.png
  • webapp/static/images/share/hr_5.png is excluded by !**/*.png
  • webapp/static/images/share/hr_6.png is excluded by !**/*.png
  • webapp/static/images/share/hr_x.png is excluded by !**/*.png
  • webapp/static/images/share/hu_1.png is excluded by !**/*.png
  • webapp/static/images/share/hu_2.png is excluded by !**/*.png
  • webapp/static/images/share/hu_3.png is excluded by !**/*.png
  • webapp/static/images/share/hu_4.png is excluded by !**/*.png
  • webapp/static/images/share/hu_5.png is excluded by !**/*.png
  • webapp/static/images/share/hu_6.png is excluded by !**/*.png
  • webapp/static/images/share/hu_x.png is excluded by !**/*.png
  • webapp/static/images/share/hy_1.png is excluded by !**/*.png
  • webapp/static/images/share/hy_2.png is excluded by !**/*.png
  • webapp/static/images/share/hy_3.png is excluded by !**/*.png
  • webapp/static/images/share/hy_4.png is excluded by !**/*.png
  • webapp/static/images/share/hy_5.png is excluded by !**/*.png
  • webapp/static/images/share/hy_6.png is excluded by !**/*.png
  • webapp/static/images/share/hy_x.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_1.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_2.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_3.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_4.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_5.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_6.png is excluded by !**/*.png
  • webapp/static/images/share/hyw_x.png is excluded by !**/*.png
  • webapp/static/images/share/ia_1.png is excluded by !**/*.png
  • webapp/static/images/share/ia_2.png is excluded by !**/*.png
  • webapp/static/images/share/ia_3.png is excluded by !**/*.png
  • webapp/static/images/share/ia_4.png is excluded by !**/*.png
  • webapp/static/images/share/ia_5.png is excluded by !**/*.png
  • webapp/static/images/share/ia_6.png is excluded by !**/*.png
  • webapp/static/images/share/ia_x.png is excluded by !**/*.png
  • webapp/static/images/share/ie_1.png is excluded by !**/*.png
  • webapp/static/images/share/ie_2.png is excluded by !**/*.png
  • webapp/static/images/share/ie_3.png is excluded by !**/*.png
  • webapp/static/images/share/ie_4.png is excluded by !**/*.png
  • webapp/static/images/share/ie_5.png is excluded by !**/*.png
  • webapp/static/images/share/ie_6.png is excluded by !**/*.png
  • webapp/static/images/share/ie_x.png is excluded by !**/*.png
  • webapp/static/images/share/is_1.png is excluded by !**/*.png
  • webapp/static/images/share/is_2.png is excluded by !**/*.png
  • webapp/static/images/share/is_3.png is excluded by !**/*.png
  • webapp/static/images/share/is_4.png is excluded by !**/*.png
  • webapp/static/images/share/is_5.png is excluded by !**/*.png
  • webapp/static/images/share/is_6.png is excluded by !**/*.png
  • webapp/static/images/share/is_x.png is excluded by !**/*.png
  • webapp/static/images/share/it_1.png is excluded by !**/*.png
  • webapp/static/images/share/it_2.png is excluded by !**/*.png
  • webapp/static/images/share/it_3.png is excluded by !**/*.png
  • webapp/static/images/share/it_4.png is excluded by !**/*.png
  • webapp/static/images/share/it_5.png is excluded by !**/*.png
  • webapp/static/images/share/it_6.png is excluded by !**/*.png
  • webapp/static/images/share/it_x.png is excluded by !**/*.png
  • webapp/static/images/share/ka_1.png is excluded by !**/*.png
  • webapp/static/images/share/ka_2.png is excluded by !**/*.png
  • webapp/static/images/share/ka_3.png is excluded by !**/*.png
  • webapp/static/images/share/ka_4.png is excluded by !**/*.png
  • webapp/static/images/share/ka_5.png is excluded by !**/*.png
  • webapp/static/images/share/ka_6.png is excluded by !**/*.png
  • webapp/static/images/share/ka_x.png is excluded by !**/*.png
  • webapp/static/images/share/ko_1.png is excluded by !**/*.png
  • webapp/static/images/share/ko_2.png is excluded by !**/*.png
  • webapp/static/images/share/ko_3.png is excluded by !**/*.png
  • webapp/static/images/share/ko_4.png is excluded by !**/*.png
  • webapp/static/images/share/ko_5.png is excluded by !**/*.png
  • webapp/static/images/share/ko_6.png is excluded by !**/*.png
  • webapp/static/images/share/ko_x.png is excluded by !**/*.png
  • webapp/static/images/share/la_1.png is excluded by !**/*.png
  • webapp/static/images/share/la_2.png is excluded by !**/*.png
  • webapp/static/images/share/la_3.png is excluded by !**/*.png
  • webapp/static/images/share/la_4.png is excluded by !**/*.png
  • webapp/static/images/share/la_5.png is excluded by !**/*.png
  • webapp/static/images/share/la_6.png is excluded by !**/*.png
  • webapp/static/images/share/la_x.png is excluded by !**/*.png
  • webapp/static/images/share/lb_1.png is excluded by !**/*.png
  • webapp/static/images/share/lb_2.png is excluded by !**/*.png
  • webapp/static/images/share/lb_3.png is excluded by !**/*.png
  • webapp/static/images/share/lb_4.png is excluded by !**/*.png
  • webapp/static/images/share/lb_5.png is excluded by !**/*.png
  • webapp/static/images/share/lb_6.png is excluded by !**/*.png
  • webapp/static/images/share/lb_x.png is excluded by !**/*.png
  • webapp/static/images/share/lt_1.png is excluded by !**/*.png
  • webapp/static/images/share/lt_2.png is excluded by !**/*.png
  • webapp/static/images/share/lt_3.png is excluded by !**/*.png
  • webapp/static/images/share/lt_4.png is excluded by !**/*.png
  • webapp/static/images/share/lt_5.png is excluded by !**/*.png
  • webapp/static/images/share/lt_6.png is excluded by !**/*.png
  • webapp/static/images/share/lt_x.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_1.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_2.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_3.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_4.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_5.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_6.png is excluded by !**/*.png
  • webapp/static/images/share/ltg_x.png is excluded by !**/*.png
  • webapp/static/images/share/lv_1.png is excluded by !**/*.png
  • webapp/static/images/share/lv_2.png is excluded by !**/*.png
  • webapp/static/images/share/lv_3.png is excluded by !**/*.png
  • webapp/static/images/share/lv_4.png is excluded by !**/*.png
  • webapp/static/images/share/lv_5.png is excluded by !**/*.png
  • webapp/static/images/share/lv_6.png is excluded by !**/*.png
  • webapp/static/images/share/lv_x.png is excluded by !**/*.png
  • webapp/static/images/share/mi_1.png is excluded by !**/*.png
  • webapp/static/images/share/mi_2.png is excluded by !**/*.png
  • webapp/static/images/share/mi_3.png is excluded by !**/*.png
  • webapp/static/images/share/mi_4.png is excluded by !**/*.png
  • webapp/static/images/share/mi_5.png is excluded by !**/*.png
  • webapp/static/images/share/mi_6.png is excluded by !**/*.png
  • webapp/static/images/share/mi_x.png is excluded by !**/*.png
  • webapp/static/images/share/mk_1.png is excluded by !**/*.png
  • webapp/static/images/share/mk_2.png is excluded by !**/*.png
  • webapp/static/images/share/mk_3.png is excluded by !**/*.png
  • webapp/static/images/share/mk_4.png is excluded by !**/*.png
  • webapp/static/images/share/mk_5.png is excluded by !**/*.png
  • webapp/static/images/share/mk_6.png is excluded by !**/*.png
  • webapp/static/images/share/mk_x.png is excluded by !**/*.png
  • webapp/static/images/share/mn_1.png is excluded by !**/*.png
  • webapp/static/images/share/mn_2.png is excluded by !**/*.png
📒 Files selected for processing (4)
  • frontend/src/game.ts
  • scripts/generate_share_images.py
  • webapp/app.py
  • webapp/data/share_translations.json

@Hugo0
Copy link
Owner Author

Hugo0 commented Mar 14, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Mar 14, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Hugo0 Hugo0 merged commit b013f81 into main Mar 14, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant